﻿using System;
using System.Data;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Collections.Generic;

namespace Gerenciador
{
    public class SQLConnect
    {
        SqlConnection Connect = null;   /*Objeto que representa a conexão SQL referente a este objeto*/


        public bool Conectar(String Servidor, String Banco, bool Autentication, String User, String Senha)
        {
            /*Estabelecendo a conexão com o banco*/
            /*-----*/
            /*String usada para apontar o servidor e a base onde estamos tentando se conectar*/
            String ConnectionString = null;
            
            /*Criando Comando de conexão*/
            if (Autentication == true)   /*true = Utilizando o windows autentication*/
                ConnectionString = "Data Source=" + Servidor + ";Initial Catalog=" + Banco + ";Integrated Security=true";
            else   /*false = Utilizando o SQL autentication*/
                ConnectionString = "Data Source=" + Servidor + ";Initial Catalog=" + Banco + ";User ID=" + User + ";Password=" + Senha;

            /*Bloco abaixo representa a tentativa inicial de conexão com o banco*/
            try
            {
                Connect = new SqlConnection(ConnectionString);   /*Logando*/

                /*Verifica se já existe uma conexão aberta, caso já exista o software não abrirá uma outra*/
                if (Connect.State == ConnectionState.Closed)
                    Connect.Open();

                return (true);   /*Conexão efetuada com sucesso*/
                               
            }
            catch
            {
                return (false);   /*Conexão falhou*/    

            }

        }


        public bool IserirRegistro(String Tabela, String[] Campos, String[] Valores)
        {
            /*Inserindo a sintaxe inicial do comando*/
            String Query = "Insert into " + Tabela + " (";   /*String que guardará o codigo final do INSERT*/

            /*Todos os campos da tabela deverão ser passados do vetor 'Campos' para a query principal*/
            for (int i = 0; i < Campos.GetLength(0); i++)
            {
                Query += Campos[i] + ", ";

            }

            /*Inserindo a sintaxe intermediária do comando*/
            Query += ") Values (";
            Query = Query.Replace(", )", ")");

            /*Todos os valores a serem inseridos deverão ser passados do vetor 'Valores' para a query principal*/
            for (int i = 0; i < Valores.GetLength(0); i++)
            {
                try   /*Faz a verificação para saber se o valor é um inteiro*/
                {
                    int Aux = int.Parse(Valores[i]);

                }
                catch   /*Caso exista algum erro na conversão para 'int' saberemos que o valor a ser inserido é uma string*/
                {
                    Valores[i] = "'" + Valores[i] + "'";   /*Adicionamos aspas simples por se tratar de uma string*/

                }

                Query += Valores[i] + ", ";   /*Linha que faz a real atribuição*/     

            }

            /*Inserindo a sintaxe final do comando*/
            Query += ")";
            Query = Query.Replace(", )", ")");

            /*Bloco responsável por criar e executar a query dentro da conexão já aberta anteriormente*/
            try
            {
                /*Comando de criação e execução*/
                SqlCommand Comando = new SqlCommand(Query, Connect);
                Comando.ExecuteNonQuery();
                return (true);   /*Retorna true quando a inserção é feita com sucesso*/

            }
            catch
            {
                return (false);   /*Retorna false quando a inserção falha por algum motivo*/

            }

        }


        public String[,] SelectFull(String Tabela)
        {
            String Query1 = "Select count(*) From " + Tabela;   /*Faz a contagem da quantidade de registros na tabela*/
            String Query2 = "Select * From " + Tabela;   /*Traz todos os registros desta tabela*/

            /*Criamos um objeto de leitura para cada query*/
            SqlDataReader Leitor1 = null;   /*Referente a 'Query1'*/
            SqlDataReader Leitor2 = null;   /*Referente a 'Query2'*/
            
            try
            {
                /*Execução da 'Query1'*/
                /*-------*/
                SqlCommand Comando = new SqlCommand(Query1, Connect);
                Leitor1 = Comando.ExecuteReader();
                Leitor1.Read();   /*Como o comando traz apenas um resultado iremos ler apenas a primeira linha*/
                /*Variável 'Res' irá ser usada neste método apenas para auxiliar a execução da 'Query2'*/
                int Res = int.Parse(Leitor1[0].ToString());
                Leitor1.Close();   /*Fechando o 'Leitor1' para que possamos iniciar o 'Leitor2'*/
                /*-------*/

                /*Execução da 'Query2'*/
                /*-------*/
                Comando = new SqlCommand(Query2, Connect);
                Leitor2 = Comando.ExecuteReader();

                /*Fazendo as atribuições de tamanho nessa matriz baseado no resultado da 'Query2'*/
                String[,] Resultado = new String[Leitor2.FieldCount, Res + 1];

                /*Esse laço faz a inserção do nome de todas as colunas na primeira linha da matriz*/
                for (int i = 0; i < Leitor2.FieldCount; i++)
                {
                    Resultado[i, 0] = Leitor2.GetName(i);

                }

                /*Esse laço faz a inserção de todos os registros nas demais linhas da matriz*/
                for (int i = 1; i <= Res; i++)
                {
                    Leitor2.Read();   /*Cada vez que essa leitura é feita, 'Leitor2' recebe um registro completo*/

                    /*Gravando as informações do registro atual na proxima linha vazia da matriz*/
                    for (int j = 0; j < Leitor2.FieldCount; j++)
                    {
                        Resultado[j, i] = Leitor2[j].ToString();

                    }

                }

                Leitor2.Close();   /*Fechando o 'Leitor2'*/

                /*Se o select for efetuado com sucesso retornamos uma matriz com todos os registros encontrados, caso não exista
                 * nenhum registro retonamos uma matriz de apenas uma linha com os campos da tabela em questão*/
                return (Resultado);

            }
            catch
            {
                return (null);   /*Caso a execução da consulta encontre algum erro retornamos null*/

            }
        
        }
              
        /*FIM*/

    }

}
